iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0
Software Development

你知道Go是什麼嗎?系列 第 22

Day22 - Redis - Golang

  • 分享至 

  • xImage
  •  

Redis,全名為 Remote Dictionary Server,是一種快速、開放原始碼、Key-Value類型、in-memory、的NoSQL資料庫。

應用情景

Redis的重點在速度、效能極高,在一些須重視速度的開發場合,就很適合使用Redis來輔助開發,在高速讀取時不用每一筆資料都對資料庫進行query,只需要讀取記憶體就能獲取資料。

下載Redis

Redis官方只提供linuxmac版本的安裝檔,因此windows版的只能自己從其他地方下載,這邊只找到5.0版本的

Redis 5.0.14.1 https://redis.io/download/

開啟Redis伺服器

  1. Redis解壓縮丟到資料夾後,從cmd開啟資料夾內的redis-server.exe,啟動server

  2. 開啟另一cmd頁面,執行redis-cli.exe,輸入ping後有回應代表連線成功。

使用Redigo

安裝套件
go get github.com/gomodule/redigo/redis

建立連線

package main

import (
	"fmt"
	"log"

	"github.com/gomodule/redigo/redis"
)

// "sort"

func main() {
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil{
		log.Fatal(err)
	}
	defer conn.Close()
	fmt.Println(conn)
}

寫入資料

存入一個id:1001的數值

func String(){
    // 連線與設定關閉
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	if err != nil{
		log.Fatal(err)
	}
	defer conn.Close()

    // 存入id
	_, err = conn.Do("set", "id", 1001)
	if err != nil{
		log.Fatal(err)
	}
}

main的地方測試

func main() {
	String() // 存入文字
    
    // 連線與設定關閉
	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
	defer conn.Close()
	if err != nil{
		log.Fatal(err)
	}
    
    // 使用get方法取得id資料
	res, err := redis.Int(conn.Do("get","id"))
	if err != nil{
		log.Fatal(err)
	}
	fmt.Println(res)
}

output:
1001

成功寫入

Connection pool

通常在使用redis時會通過connection pool(連接池)來幫助連線,需要連接redis時則從池子裡拉一條出來用,用完要記得釋放。

var pool *redis.Pool
func main(){
	pool = &redis.Pool{
		MaxIdle: 8, //最大空閒連接數
		MaxActive: 0, // 最大連接數,0表示沒限制
		IdleTimeout: 100, // 最大空閒時間
        
		Dial: func() (redis.Conn, error) {
			//建構連線
			return redis.Dial("tcp", "127.0.0.1:6379")
		},

		//定期對 redis server 做 ping/pong 測試
		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			if time.Since(t) < time.Minute {
				return nil
			}
			_, err := c.Do("PING")
			return err
		},
	}
	defer pool.Close()

}

把上面的寫入與讀取修正成使用pool的方式運行

func String(pool *redis.Pool){
	conn := pool.Get()
	defer conn.Close()
	_, err := conn.Do("set", "id", 1001)
	if err != nil{
		log.Fatal(err)
	}
}

func GetId(pool *redis.Pool) int{
	conn := pool.Get()
	defer conn.Close()
	res, err := redis.Int(conn.Do("get","id"))
	if err != nil{
		log.Fatal(err)
	}
	return res
}

Redis的部分應該就到這了,發現這兩天講的真的都不夠深,但還沒有實際應用的狀況下我也不大會寫,就都只做了基本的運作而已。

參考資料

Redis 安装
https://www.runoob.com/redis/redis-install.html

golang:使用redigo连接并操作Redis
https://blog.csdn.net/lena7/article/details/120345051

Go-Redis 连接池(Pool)源码分析
https://pandaychen.github.io/2020/02/22/A-REDIS-POOL-ANALYSIS/

Golang 如何使用 redis
https://ithelp.ithome.com.tw/articles/10208335


上一篇
Day21 - NoSQL - Golang
下一篇
Day23 - WebSocket - Golang
系列文
你知道Go是什麼嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言